\documentclass{article}
\usepackage{ctex}
\usepackage{geometry}
\usepackage{ragged2e}
\usepackage{graphicx}
\usepackage{enumerate}
\usepackage{listings}
\usepackage{xcolor}
\lstset{
  basicstyle=\ttfamily\small,    % 等宽字体
  numbers=left,                   % 显示行号
  numberstyle=\tiny\color{gray},  % 行号样式
  frame=single,                   % 边框样式
  breaklines=true,                % 自动换行
  keywordstyle=\color{blue},      % 关键字颜色
  commentstyle=\color{green!40!black}, % 注释颜色
  stringstyle=\color{red}         % 字符串颜色
}
\geometry{a4paper,scale=0.7}
\title{七段数码管与小键盘实验报告}
\author{赵俊宇 PB24061271}
\date{2025.3.29}
\begin{document}
\maketitle
\tableofcontents
\section{七段数码管的正确打开方式}
    数码管的动态显示是通过按时序改变阴极通断完成的.
    
    这代表着,通过循环输出0b1110,0b1101,0b1011,0b0111,在循环速度足够快时,就可以从视觉上显示出"静态"的效果.
    即:
    \begin{lstlisting}[language=C]
            for(i=0;i<4;i++){
            PORTC |=0x0f;
            PORTB =(seg7_hex[d_t%10]);
            PORTC =seg7_com[i];
            d_t /=10;
            _delay_ms(5); 
            }
    \end{lstlisting}
\section{中断的意义}
    在操作系统领域,我们常说:``中断是系统的灵魂",在MCU编程中同样如此.

    在上次实验中,我们发现,LED在进行利用延时产生的呼吸效果时会出现触摸开关不起效果的情况,
    针对此种情况,我们可以使用中断应对.中断在此处的作用,即是打断当前任务的作用,
    使MCU立刻触发,响应我们设置的``关键任务''.

    设置中断的代码如下:
    \begin{lstlisting}[language=C]
        DDRD &=~(1<<DDRD3);
	MCUCR |=(1<<ISC10)|(1<<ISC11);
	GICR |=(1<<INT1);
	sei();
    \end{lstlisting}

    当我们给PD3输入时,就会中断当前任务,执行我们设定好的代码,这样就避免了先前延时无法响应的问题.
\section{一种避免小键盘造成的叠加现象的方法}
    在开始前,我们首先分析问题的成因.
    可以发现,我们按下一次按键,但却显示了好几次,这个问题是由于,MCU的运行速度太快,仅仅在我们按下按钮的短短几十毫秒
    MCU的``while\(1\)''循环就执行了好几次.

    因此,我们需要减缓运行速度,拉长一个周期的时间.在一个周期中,我们只进行了两个行为:扫描键盘和点亮数码管
    .那么,不妨先试试增加扫描时长,在扫描时加入delay.

    结果发现,虽然叠加问题解决了,但是却出现了新的问题--数码管亮度不够.这是因为相较于调整前,相同时间数码管发光时长变短了
    ,自然而然,视觉效果上就会不够理想.

    那么,可以增加数码管的点亮时长,怎么增加呢?原代码如下:
    \begin{lstlisting}[language=C]
		for (j=0;j<4;j++)
			{
				PORTC |=0x0f;
				PORTB =seg7_hex[seg7_no[j]];
				PORTC =seg7_com[j];
				_delay_ms(1);
			}
    \end{lstlisting}
    
    如果我们增加delay函数的时间,就会出现新的问题--由于增加了阴极切换的时间,数码管各个位的变化居然变得可见了起来.
    因此,这么操作是不合适的.

    那么,我们可以让这个过程多重复几次,也能做到增加数码管点亮时长.
    即:
    \begin{lstlisting}[language=C++]
        for(i=0;i<40;i++)
		for (j=0;j<4;j++)
			{
				PORTC |=0x0f;
				PORTB =seg7_hex[seg7_no[j]];
				PORTC =seg7_com[j];
				_delay_ms(1);
			}
    \end{lstlisting}

    其中,4是经验数字,通过测试,取35-50为宜,35时按压时间稍长就会出现显示两个的现象,
    50时,按压按键稍快即会出现无法触发的现象.
    \section{总结}
    在本次实验中,我们继续利用管脚输入输出信息,通过扫描的方法读取键盘状态,利用高低电平控制数码管通断,
    实现两个硬件间的联动效果.

    \paragraph{}
    \hfill 赵俊宇

    \hfill PB24061271
\end{document}